Go to the first, previous, next, last section, table of contents.

Summary of GDL Syntax

Whitespace is never significant, except to separate two symbols or within a string or escaped symbols.

Regular expression for symbol is [-a-z0-9A-Z]* or |[^|]*|.

Number is [-]*[0-9][0-9]* optional [d]*[0-9][0-9]*, [+]*[0-9][0-9]*.

String is "[^"]*".

Comments extend from ; to end of the line, or may be everything enclosed between #| and |# (which nest properly).

form ::= module-form
        | ( include module-name [ variant-setting ]* )
        | ( if test-form [ symbol ] )
        | ( else [ symbol ] )
        | ( end-if [ symbol ] )
        | world-form
        | area-form
        | side-form
        | side-defaults-form
        | independent-units-form
        | doctrine-form
        | player-form
        | agreement-form
        | unit-form
        | unit-defaults-form
        | scorekeeper-form
        | exu-form
        | evt-form
        | battle-form
        | unit-type-form
        | terrain-type-form
        | material-type-form
        | namer-form
        | table-form
        | add-form
        | imf-form
        | palette-form
        | color-form
        | ( define symbol value )
        | ( set symbol value )
        | ( undefine symbol value )
        | ( print value )
        | value
module-form ::= ( game-module [ module-name ]
        [ game-module-property-binding ]* )

module-name ::= string

game-module-property-binding ::= ( game-module-property-name value )

game-module-property-name ::=
          base-game | title | blurb | picture-name | instructions | notes
        | design-notes | program-version | base-module | default-base-module
        | variants | version

variant-definition ::=
        ( [ string ] var-type [ var-default ] [ var-range ] [ var-clause ]* )

var-type ::= world-size | world-seen | see-all
        | sequential | real-time | symbol

var-default ::= value

var-range ::= ( value value )

var-clause ::= ( [ string ] value [ form ]* )
variant-setting ::= ( var-type value )
world-form ::= ( world [ circumference ] [ world-property-binding ]* )

world-property-binding ::= ( world-property-name value )

world-property-name ::=
        axial-tilt | circumference | day-length | year-length

circumference ::= value
area-form ::= ( area [ width [ height ] ] [ area-restriction ]
        [ area-property-binding ]* )

area-restriction ::= ( restrict width height a-x a-y )

area-property-binding ::= ( area-property-name value )
        | ( terrain [ layer-subform ]* [ string ]* )
        | ( aux-terrain terrain-type [ layer-subform ]* [ string ]* )
        | ( features feature-list [ layer-subform ]* [ string ]* )
        | ( material material-type [ layer-subform ]* [ string ]* )
        | ( people-sides [ layer-subform ]* [ string ]* )
        | ( elevations [ layer-subform ]* [ string ]* )
        | ( temperatures [ layer-subform ]* [ string ]* )
        | ( winds [ layer-subform ]* [ string ]* )
        | ( clouds [ layer-subform ]* [ string ]* )
        | ( cloud-bottoms [ layer-subform ]* [ string ]* )
        | ( cloud-heights [ layer-subform ]* [ string ]* )

area-property-name ::= width | height | latitude | longitude | cell-width

layer-subform ::= ( constant n )
        | ( subarea a-x a-y width height )
        | ( xform mul add )
        | ( by-bits )
        | ( by-char string )
        | ( by-name name-list )

width ::= value

height ::= value

a-x ::= value

a-y ::= value

n ::= value

mul ::= value

add ::= value
side-form ::= ( side [ side-id ] [ side-property-binding ]* )

side-defaults-form ::= ( side-defaults [ side-property-binding ]* )

side-property-binding ::= ( side-property-name value )

side-property-name ::=
          name | long-name | short-name | noun | plural-noun
        | adjective | color | emblem-name | names-locked
        | class | active | status | advantage | advantage-min | advantage-max
        | controlled-by | trusts | trades | next-numbers | unit-namers
        | feature-namers | tech | init-tech | terrain-view | unit-view
        | unit-view-dates | turn-time-used | total-time-used | timeouts
        | timeouts-used | finished-turn | willing-to-draw
        | doctrines | doctrines-locked
        | self-unit | priority | scores | ui-data | ai-data | player
doctrine-form ::= ( doctrine ... )
player-form ::= ( player [ player-id ] [ player-property-binding ]* )

player-id ::= number

player-property-binding ::= ( player-property-name value )

player-property-name ::= name | config-name | display-name | ai-type-name
        | password | initial-advantage
agreement-form ::= ( agreement [ agreement-id ] [ agreement-property-binding ]* )

agreement-id ::= value

agreement-property-binding ::= ( agreement-property-name value )

agreement-property-name ::= type-name | title | terms | drafters
        | proposers | signers | willing-to-sign | known-to | enforcement
        | state
unit-form ::= ( unit [ unit-id ] [ unit-property-binding ]* )
        | ( unit-type-name u-x u-y u-side [ unit-property-binding ]* )

unit-defaults-form ::= ( unit-defaults [ reset ] [ unit-property-binding ]* )

unit-property-binding ::=
          ( unit-property-name value )
        | ( act action-type-name [ action-property-binding ]* )
        | ( plan plan-type-name [ plan-property-binding ]* )
        | ( task task-type-name [ task-property-binding ]* )
        | ( x [ unit-x-property-binding ]* )

unit-property-name ::=
          @ | # | cp | cxp | hp | in | m | mo | n | nb | opinions | s | tp | z

unit-id ::= value

u-x ::= value

u-y ::= value

u-side ::= value

unit-x-property-binding ::=
          ( unit-x-property-name value )
          ( symbol value )

unit-x-property-name ::= appear | disappear
action-type-name ::=
          add-terrain | alter-terrain | attack | build | capture | change-side
        | change-type | create-at | create-in | detonate | disband | enter
        | fire-at | fire-into | move | none | overrun | produce
        | remove-terrain | repair | research | toolup | transfer
        | transfer-part

action-property-binding ::=
          ( action-property-name value )

action-property-name ::= a | aa | acp | acp0 | am
plan-type-name ::=
          defensive | exploratory | none | offensive | passive | random

plan-property-binding ::=
          ( plan-property-name value )
        | ( goal goal-type-name ... )

plan-property-name ::=
          ai-control | asleep | delayed | formation | goal | reserve
        | supply-alarm | supply-is-low
goal-type-name ::=
          cell-is-occupied | has-material-type | has-unit-type
        | has-unit-type-near | keep-formation | lost-game
        | no-goal | positions-known | vicinity-is-held
        | vicinity-is-known | won-game | world-is-known
task-type-name ::=
        | build | capture | do-action | hit-position | hit-unit | move-dir
        | move-to | none | occupy | pickup | repair | research
        | resupply | sentry
scorekeeper-form ::= ( scorekeeper [ sk-id ] [ sk-property-binding ]* )

sk-id ::= value

sk-property-binding ::= ( sk-property-name value )

sk-property-name ::=
          applies-to | do | initial | known-to | messages | title
        | trigger | triggered | when

sk-when ::= after-action | after-event | after-turn | before-turn
exu-form ::= ( exu id type x y side [ exu-property-binding ]* )

exu-property-binding ::= ( exu-property-name value )

exu-property-name ::= n | nb | z

evt-form ::= ( evt turn evt-type-name observers [ value ]* )
evt-type-name ::= 
          action-done | action-error | action-ok
        | cannot-do | cannot-leave-world | capture-failed
        | capture-succeeded | destination-full | fire-into-outside-world
        | game-ended | game-restarted | game-saved
        | game-started | insufficient-acp | insufficient-material
        | insufficient-mp | log-ended | log-started
        | overrun-failed | overrun-succeeded | side-joined
        | side-lost | side-withdrew | side-won
        | too-far | too-near | unit-acquired
        | unit-assaulted | unit-captured | unit-completed
        | unit-created | unit-damaged | unit-disbanded
        | unit-garrisoned | unit-killed | unit-left-world
        | unit-moved | unit-name-changed | unit-started-with
        | unit-starved | unit-type-changed | unit-vanished
        | unit-wrecked
battle-form ::= ( battle ... )
unit-type-form ::=
        ( unit-type unit-type-name [ unit-type-property-binding ]* )

unit-type-name ::= symbol

unit-type-property-binding ::= ( unit-type-property-name value )

unit-type-property-name ::=
          acp-damage-effect | acp-max | acp-min
        | acp-per-turn | acp-per-turn-max | acp-per-turn-min
        | acp-season-effect | acp-temperature-effect | acp-to-change-side
        | acp-to-detonate | acp-to-disband | acp-to-fire
        | acp-to-move | acp-to-transfer-part | action-priority
        | already-seen | already-seen-independent | assign-number
        | available | can-be-self | capacity | char | color
        | consumption-temperature-effect | country-units-max
        | cp | cp-per-self-build | cp-to-self-build | cxp-max
        | cxp-on-capture-effect
        | description-format | detonate-on-death | direct-control
        | elevation-at-max-range | extensions | free-acp
        | free-mp | generic-name | has-opinions | help | hit-falloff-range
        | hp-max | hp-per-detonation | hp-per-disband | hp-recovery
        | image-name | independent-growth-chance | independent-near-start
        | independent-takeover-chance | initial-seen-radius | long-name
        | move-range | mp-to-leave-world | name | name-internal | namer
        | notes | occupant-total-max | parts-max | point-value
        | possible-sides | range | range-min
        | revolt-chance | see-always | see-occupants
        | self-changeable | self-resurrects | short-name
        | speed | speed-damage-effect | speed-max
        | speed-min | speed-wind-angle-effect | speed-wind-effect
        | spot-action | spy-chance | spy-range
        | stack-order | start-with | tech-from-ownership
        | tech-leakage | tech-max | tech-per-turn-max
        | tech-to-build | tech-to-own | tech-to-see
        | tech-to-use | temperature-attrition | type-in-game-max
        | type-per-side-max | unit-growth-chance | unit-takeover-chance
        | vision-bend | vision-range | wrecked-type
        | zz-b | zz-bb | zz-bw | zz-c | zz-cc | zz-cm | zz-transport
terrain-type-form ::=
        ( terrain-type terrain-type-name [ terrain-type-property-binding ]* ) )

terrain-type-name ::= symbol

terrain-type-property-binding ::= ( terrain-type-property-name value )

terrain-type-property-name ::=
          alt-percentile-max | alt-percentile-min | available
        | capacity | char | clouds-max
        | clouds-min | color | country-growth-chance
        | country-people-chance | country-takeover-chance
        | country-terrain-max | country-terrain-min
        | description-format | elevation-max | elevation-min
        | extensions | help | image-name | independent-people-chance
        | liquid | maze-passage-occurrence | maze-room-occurrence
        | name | notes | occurrence | people-max
        | river-chance | subtype | subtype-x
        | temperature-average | temperature-max | temperature-min
        | temperature-variability | thickness | wet-percentile-max
        | wet-percentile-min | wind-force-average | wind-force-max
        | wind-force-min | wind-force-variability | wind-variability
        | zz-fr
material-type-form ::=
        ( material-type material-type-name [ m-type-property-binding ]* ) )

material-type-name ::= symbol

m-type-property-binding ::= ( m-type-property-name value )

m-type-property-name ::=
          available | char | color | description-format | extensions | help
        | image-name | name | notes | people
namer-form ::= ( namer [ namer-id ] naming-method state )

namer-id ::= value

naming-method ::=
          junky
        | ( random [ string ]* )
        | ( grammar symbol number [ grammar-rule ]* )

grammar-rule ::= ( symbol ( [ rule-type ] [ weight ] data )

rule-type ::= any | or | reject | capitalize

state ::= value        
table-form ::= ( table table-name [ add ] [ table-clause ]* )

table-clause ::=
          value
        | ( type-or-types type-or-types value )

table-name ::=
          uu-table-name | ut-table-name | um-table-name
        | tt-table-name | tm-table-name | mm-table-name
uu-table-name ::=
        | acp-for-retreat | acp-occupant-effect | acp-to-attack
        | acp-to-be-fired-on | acp-to-build | acp-to-capture
        | acp-to-change-type | acp-to-create | acp-to-defend
        | acp-to-enter-unit | acp-to-repair | acp-to-research
        | acp-to-toolup | attack-range | attack-range-min
        | bridge | build-range | can-enter-independent
        | capture-chance | control-chance | control-chance-adjacent
        | control-chance-at | control-range | cp-on-creation
        | cp-per-build | create-range | cxp-per-capture
        | cxp-per-combat | damage | damage-cxp-effect
        | detonate-on-approach-range | detonate-on-capture
        | detonate-on-hit | detonation-damage-adjacent
        | detonation-damage-at | detonation-unit-range
        | ferry-on-departure | ferry-on-entry | hit-at-max-range-effect
        | hit-chance | hit-cxp-effect | hp-min
        | hp-per-repair | hp-to-garrison | hp-to-repair
        | independent-capture-chance | mp-to-enter-unit | mp-to-enter-zoc
        | mp-to-leave-unit | mp-to-leave-zoc | mp-to-traverse-zoc
        | occupant-can-construct | occupant-can-have-occupants
        | occupant-combat | occupant-escape-chance | occupant-max
        | occupant-vision | protection | retreat-chance | road-chance
        | scuttle-chance | see-chance | see-chance-adjacent
        | see-chance-at | speed-occupant-effect | spy-quality
        | stack-protection | surrender-chance | surrender-chance-per-attack
        | surrender-range | tech-crossover | tech-per-research
        | temperature-protection | tp-attrition | tp-crossover
        | tp-max | tp-per-toolup | tp-to-build
        | unit-capacity-x | unit-size-as-occupant | withdraw-chance-per-attack
        | zoc-range | zz-basic-capture-worth | zz-basic-hit-worth
        | zz-basic-transport-worth
ut-table-name ::=
          accident-damage | accident-hit-chance | accident-vanish-chance
        | acp-night-effect | acp-to-add-terrain | acp-to-remove-terrain
        | alter-terrain-range | altitude-max | altitude-min
        | attack-terrain-effect | attrition | defend-terrain-effect
        | detonation-accident-chance
        | detonation-terrain-damage-chance | detonation-terrain-range
        | eye-height | favored-terrain | independent-density
        | mp-to-enter-terrain | mp-to-leave-terrain | mp-to-traverse
        | people-surrender-chance | productivity | terrain-capacity-x
        | unit-size-in-terrain | vanishes-on | visibility
        | vision-night-effect | wrecks-on | zoc-from-terrain-effect
        | zoc-into-terrain
um-table-name ::=
          acp-to-load | acp-to-produce | acp-to-unload
        | base-consumption | base-production | consumption-as-occupant
        | consumption-on-creation
        | consumption-per-attack | consumption-per-build
        | consumption-per-move | consumption-per-repair | hit-by
        | hp-per-starve | in-length | load-max
        | material-per-production | material-to-act | material-to-build
        | material-to-change-type | material-to-create | material-to-fight
        | material-to-move | material-to-produce | material-to-repair
        | occupant-base-production | out-length | people-see-chance
        | people-surrender-effect | productivity-max | productivity-min
        | recycleable-material | supply-on-completion | supply-on-creation
        | supply-per-disband | unit-initial-supply | unit-storage-x
        | unload-max
tt-table-name ::=
          adjacent-terrain-effect | coating-depth-max | coating-depth-min
        | road-into-chance | terrain-damaged-type
tm-table-name ::=
          change-on-exhaustion-chance
        | terrain-consumption | terrain-exhaustion-type
        | terrain-initial-supply | terrain-production | terrain-storage-x
mm-table-name ::= people-consumption | people-production
add-form ::= ( add type-or-types property-name value )
imf-form ::= ( imf string [ imf-property-binding ]* [ image ]* )

imf-property-binding ::= ...

image ::= ( ( w h [ tile ] ) [ image-property-binding ]*
        [ subimage * ] )

image-property-binding ::= ( image-property-name value )

image-property-name ::= actual | embed | embed-at | palette | pixel-size
        | row-bytes

subimage ::= ( subimage-type string * )

subimage-type ::= color | mono | mask

palette-form ::= ( palette ... )

color-form ::= ( color string r g b )
type-or-types ::= type | symbol | ( [ type | symbol ]* )

value ::=
          number
        | symbol
        | global-variable
        | predefined-symbols
        | ( [ value ]* )
        | ( operation-name [ value ]* )

operation-name ::=
          quote | list | append | remove | /= | < | <= | = | > | >=

global-constant ::=
          true | false
        | u* | t* | m*
        | non-unit | non-terrain | non-material
        | border | cell | coating | connection
        | over-all | over-border | over-nothing | over-own
        | no-x | river-x | road-x | valley-x
global-variable ::=
          action-messages | advantage-default | advantage-max
        | advantage-min | alt-blob-density | alt-blob-height
        | alt-blob-size | alt-smoothing | calendar
        | country-radius-max | country-radius-min | country-separation-max
        | country-separation-min | edge-terrain | elapsed-real-time
        | event-messages | extra-turn-chance | feature-namers
        | feature-types | grid-color | growth-stop-chance
        | initial-date | initial-day-part | initial-year-part
        | last-turn | maze-passage-density | maze-room-density
        | player-sides-locked | random-events | random-state
        | real-time-for-game | real-time-per-side | real-time-per-turn
        | river-sink-terrain | scorefile-name | season-names
        | see-all | see-terrain-always | see-weather-always
        | self-required | side-library | sides-max
        | sides-min | synthesis-methods | temperature-floor
        | temperature-floor-elevation | temperature-moderation-range
        | temperature-year-cycle
        | terrain-seen | turn | units-in-game-max
        | units-per-side-max | unseen-char | unseen-color
        | unseen-image-name | use-side-priority | wet-blob-density
        | wet-blob-height | wet-blob-size | wet-smoothing
        | wind-mix-range
synthesis-methods ::=
          make-countries | make-earthlike-terrain
        | make-fractal-percentile-terrain | make-independent-units
        | make-initial-materials | make-maze-terrain
        | make-random-date | make-random-terrain | make-rivers
        | make-roads | make-weather | name-geographical-features
        | name-units-randomly
random-event-method ::=
          accidents-in-terrain | attrition-in-terrain
        | units-revolt | unit-surrender

Go to the first, previous, next, last section, table of contents.